﻿#include<iostream>
#include<set>
using namespace std;
//int main()
//{
//	// 去重+升序排序 
//	set<int> s1;
//	 //去重+降序排序（给⼀个⼤于的仿函数） 
//    //set<int, greater<int>> s;
//	s1.insert(5);
//	s1.insert(2);
//	s1.insert(7);
//	s1.insert(5);
//
//	//set<int>::iterator it = s.begin();
//	auto it = s1.begin();
//	while (it != s1.end())
//	{
//		// error C3892: “it”: 不能给常量赋值 
//        // *it = 1;
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//
//	return 0;
//}

//int main()
//{
//	set<int> s1;
//
//	// 插⼊⼀段initializer_list列表值，已经存在的值插⼊失败 
//	s1.insert({ 2,8,3,9 });
//	for (auto it : s1)
//	{
//		cout << it << " ";
//	}
//	cout << endl;
//
//
//	return 0;
//}

//int main()
//{
//	set<string> strset = { "sort", "insert", "add" };
//
//	// 遍历string⽐较ascll码⼤⼩顺序遍历的 
//	for (auto& e : strset)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

//int  main()
//{
//	set<int> s1 = { 1,2,3,4,5 };
//
//	//count查找数值，存在就返回1，不存在返回0
//	if (s1.count(4))
//	{
//		cout << "存在" << endl;
//	}
//	else
//	{
//		cout << "不存在" << endl;
//	}
//
//
//	return 0;
//}

//int  main()
//{
//	set<int> s1 = { 4,2,7,2,8,5,9 };
//	for (auto it : s1)
//	{
//		cout << it << " ";
//	}
//	cout << endl;
//	//删除⼀个迭代器位置的值
//	
//	// 删除最⼩值-第一个位置的元素就是最小值
//	s1.erase(s1.begin());
//
//	for (auto it : s1)
//	{
//		cout << it << " ";
//	}
//	cout << endl;
//
//
//	return 0;
//}

//int main()
//{
//	set<int> s1 = { 4,2,7,2,8,5,9 };
//	for (auto it : s1)
//	{
//		cout << it << " ";
//	}
//	cout << endl;
//	// 直接删除x 
//	int x;
//	cin >> x;
//
//	int num = s1.erase(x);
//	if (num == 0)
//	{
//		cout << "不存在" << endl;
//	}
//
//	for (auto it : s1)
//	{
//		cout << it << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	set<int> s = { 4,2,7,2,8,5,9 };
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//
//	int x;
//	// 直接查找在利⽤迭代器删除x 
//	cin >> x;
//	auto pos = s.find(x);
//	//set<int>::iterator pos = s.find(x);
//
//	if (pos != s.end())
//	{
//		s.erase(pos);
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//
//	return 0;
//}

//int main()
//{
//	std::set<int> s;
//	for (int i = 1; i < 10; i++)
//		s.insert(i * 10); // 10 20 30 40 50 60 70 80 90
//
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	// 实现查找到的[itlow,itup)包含[30, 60]区间 
//
//	// 返回 >= 30 
//	auto itlow = s.lower_bound(30);
//	// 返回 > 60 
//	auto itup = s.upper_bound(60);
//
//	// 删除这段区间的值 
//	s.erase(itlow, itup);
//
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//
//	//// 利⽤count间接实现快速查找 
//	//int x;
//	//cin >> x;
//	//if (s.count(x))
//	//{
//	//	cout << x << "在！" << endl;
//	//}
//	//else
//	//{
//	//	cout << x << "不存在！" << endl;
//	//}
//
//
//	return 0;
//}

int main()
{
	// 相⽐set不同的是，multiset是排序，但是不去重 
	multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };
	auto it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 相⽐set不同的是，x可能会存在多个，find查找中序的第⼀个 
	//int x;
	//cin >> x;
	//auto pos = s.find(x);

	//while (pos != s.end() && *pos == x)
	//{
	//	cout << *pos << " ";
	//	++pos;
	//}
	//cout << endl;

	// 相⽐set不同的是，count会返回x的实际个数 

	//cout << s.count(x) << endl;

	// 相⽐set不同的是，erase给值时会删除所有的x 
	//int x;
	//cin >> x;
	//s.erase(x);
	//for (auto e : s)
	//{
	//	cout << e << " ";
	//}
	//cout << endl;

	//return 0;
}